﻿#define  _CRT_SECURE_NO_WARNINGS 1

#include <iostream>
#include <string>
#include <vector>
using namespace std;

// 继承

//// 不继承时
//class Student
//{
//public:
//	Student()
//		:_name("李四")
//		,_stuid(986543)
//	{}
//
//	void identify()
//	{
//		cout << "identify()" << endl;
//	}
//
//	void study()
//	{
//		cout << _stuid << endl;
//		cout << "study" << endl;
//	}
//
//protected:
//	string _name; // 姓名
//	string _tel; // 电话
//	string _address; //地址
//	int _age;
//
//	int _stuid; // 学号
//};
//
//class Teacher
//{
//public:
//	Teacher()
//		:_name("张三")
//		,_title(818232)
//	{}
//
//	void identify()
//	{
//		cout << "identify()" << endl;
//	}
//
//	void teaching()
//	{
//		cout << _title << endl;
//		cout << "teaching" << endl;
//	}
//
//protected:
//	string _name; // 姓名
//	string _tel; // 电话
//	string _address; //地址
//	int _age;
//
//	int _title; // 职工号
//};
//
//int main()
//{
//	Teacher t;
//
//	Student s;
//
//	s.study();
//	t.teaching();
//
//	return 0;
//}


// 继承版本
//class Person
//{
//public:
//	void identify()
//	{
//		cout << "identify()" << endl;
//	}
//
//protected:
//	string _name; // 姓名
//	string _tel; // 电话
//	string _address; //地址
//	int _age;
//};
//
//class Student : public Person
//{
//public:
//	Student()
//		:_stuid(986543)
//	{}
//	void study()
//	{
//		cout << _stuid << endl;
//		cout << "study" << endl;
//	}
//
//protected:
//	int _stuid; // 学号
//};
//
//class Teacher : public Person
//{
//public:
//	Teacher()
//        :_title(818232)
//	{}
//
//	void teaching()
//	{
//		cout << _title << endl;
//		cout << "teaching" << endl;
//	}
//
//protected:
//	int _title; // 职工号
//};
//
//int main()
//{
//	Teacher t;
//
//	Student s;
//
//	s.study();
//	t.teaching();
//
//	return 0;
//}

// 继承实现栈

template<typename T>
class stack : protected vector<T>
{
// 基类是类模板时，需要指定⼀下类域，
// 否则编译报错:error C3861: “push_back”: 找不到标识符
// 因为stack<int>实例化时，也实例化vector<int>了
// 但是模版是按需实例化，push_back等成员函数未实例化，所以找不到
public:
	void push(const T& x)
	{
		// 模板会按需实例化
		vector<T>::push_back(x);
	}

	void pop()
	{
		vector<T>::pop_back();
	}

	size_t size() const
	{
		return vector<T>::size();
	}

	bool empty() const
	{
		return vector<T>::empty();
	}

	const T& top() const
	{
		return vector<T>::back();
	}

protected:
};

void test_stack()
{
	stack<int> s;
	s.push(1);
	s.push(2);
	s.push(3);
	s.push(4);
	s.push(5);

	cout << "size: " << s.size() << endl;
	while (!s.empty())
	{
		cout << s.top() << " ";
		s.pop();
	}
	cout << endl;
}

//int main()
//{
//	test_stack();
//
//	return 0;
//}

//public继承的派⽣类对象，可以赋值给，基类的指针 / 基类的引⽤
//class AA
//{
//public:
//	void Print()
//	{
//		cout << "dwdhiw" << endl;
//	}
//
//	void put()
//	{
//		cout << _a1 << _a2 << _a3 << endl;
//	}
//
//
//	int _a1 = 1;
//	int _a2 = 2;
//	int _a3 = 3;
//};
//
//class BB : public AA
//{
//public:
//	void modify()
//	{
//		_a1 = 10;
//		_a2 = 20;
//		_a3 = 30;
//	}
//
//	void Print(int a = 10) // 构成隐藏
//	{
//		cout << "a = " << a << endl;
//	}
//
//
//	int _b1;
//	int _b2;
//};
//
//int main()
//{
//	BB b1;
//	b1.Print();
//	b1.AA::Print();
//	b1.modify();
//	
//	AA a1;
//	a1.put();
//
//	a1 = b1;
//	a1.put();
//
//	AA* pa = &b1;
//	AA& ra = b1;
//
//	b1._a1 = 100;
//	pa->put();
//
//	return 0;
//}